package com.jketing.entity.ams.sys;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import com.jketing.entity.BaseEntity;
import com.jketing.entity.ams.base.Person;

/**
 * Account 系统账号实体
 * 
 * @author  李荣华
 * @version v1.0
 * @date     2017-08-16
 * @since   Jpa 2.1
 */
@Entity
@Table(name = "Account_")
public class Account extends BaseEntity {
	private static final long serialVersionUID = 2151532790489746357L;
	/**
	 * person:所属人
	 */
	private Person person;
	/**
	 * useable:启用状态
	 */
	private String useable;
	/**
	 * themes:主题风格
	 */
	private String themes;
	/**
	 * range:查询范围
	 */
	private String range;
	/**
	 * type:账号类型
	 */
	private String type;
	/**
	 * loginName:账号英文名
	 */
	private String loginName;
	/**
	 * nickname:昵称
	 */
	private String nickName;
	/**
	 * mobile:手机号
	 */
	private String mobile;
	/**
	 * email:电子邮箱
	 */
	private String email;
	/**
	 * password:用户密码
	 */
	private String password;	
	/**
	 * joinTime:注册时间
	 */
	private Date joinTime;
	/**
	 * remark:备注
	 */
	private String remark;
	/**
	 * defaultRole:默认角色
	 */
	private Role defaultRole;	
	/**
	 * roles:角色集合
	 */
	private Set<Role> roles = new HashSet<Role>();

	/**
	 * person 所属人
	 * 由personId引用的当前系统用户的人员对象
	 */
	@ManyToOne
	@JoinColumn(name = "personId")
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	
	/**
	 * useable 启用状态
	 * 
	 * true是启用
	 * false是禁用
	 */
	@Column(name="Useable_",nullable = false, length = 16)
	public String getUseable() {
		return useable;
	}
	public void setUseable(String useable) {
		this.useable = useable;
	}
	
	/**
	 * themes:主题风格
	 * 
	 * 保存账号皮肤设置
	 */
	public String getThemes() {
		return themes;
	}
	public void setThemes(String themes) {
		this.themes = themes;
	}
	
	/**
	 * range:查询范围
	 * 
	 * 取值如下：
	 * max:最大范围;可以访问scope字段值除private外所有数据
	 * group:集团范围;可以访问系统内scope值为public的公有数据和本账号所属集团内scope值为group、unit、branch的数据,一般有集团领导职务的员工账号属此范围
	 * unit:单位范围;可以访问系统内scope值为public的公有数据和本账号所属单位内scope值为unit、branch的数据,一般有单位领导职务的员工账号属此范围
	 * branch:部门范围;可以访问系统内scope值为public的公有数据和本账号所属部门内scope值为branch的数据,一般普通员工账号属此范围
	 * min:最小范围;只能访问系统内scope值为public的公有数据,一般公众账号和管理员账号属此范围
	 * 
	 * 配合scope字段实现查询范围控制
	 * 
	 * 注：此字段为控制字段，不作为显示字段显示给用户看
	 * 	  范围控制的查询条件设置由系统根据登录账号的range值和业务实体的scope值进行控制,对用户透明 
	 * 
	 */
	@Column(name="range_",nullable = false, length = 16)
	public String getRange() {
		return range;
	}
	public void setRange(String range) {
		this.range = range;
	}
	
	/**
	 * type 账号类型
	 * 
	 * peopleAccount:公众账号
	 * normalAccount:职工账号
	 * adminAccount:管理账号
	 * 
	 * 注:控制字段
	 */
	@Column(name="type_",length=16)
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	
	/**
	 * loginName 登录账号  
	 * 充许使用账号、手机号或电子邮箱的任何一种登录，故账号不能重复注册
	 */
	public String getLoginName() {
		return loginName;
	}
	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}
	
	/**
	 * nickname 昵称
	 */
	public String getNickName() {
		return nickName;
	}
	public void setNickName(String nickName) {
		this.nickName = nickName;
	}
	
	/**
	 * mobile 手机号 
	 * 充许使用账号、手机号或电子邮箱的任何一种登录，故手机号不能重复注册
	 */
	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	
	/**
	 * email 电子邮箱 
	 * 充许使用账号、手机号或电子邮箱的任何一种登录，故电子邮箱号不能重复注册
	 */
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	/**
	 * password 登录密码
	 */
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	/**
	 * joinTime 注册时间
	 */
	@Temporal(value = TemporalType.TIMESTAMP)
	public Date getJoinTime() {
		return joinTime;
	}
	public void setJoinTime(Date joinTime) {
		this.joinTime = joinTime;
	}
	
	/**
	 * remark 备注
	 */
	public String getRemark() {
		return remark;
	}
	public void setRemark(String remark) {
		this.remark = remark;
	}
	
	/**
	 * defaultRole 默认角色
	 */
	@ManyToOne
	@JoinColumn(name = "RoleId")
	public Role getDefaultRole() {
		return defaultRole;
	}
	public void setDefaultRole(Role defaultRole) {
		this.defaultRole = defaultRole;
	}
	
	/**
	 * roles 账号拥有的角色集合
	 */
	@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH }, fetch = FetchType.LAZY)
	@JoinTable(name = "AccountMapRole", 
			   joinColumns = { @JoinColumn(name = "AccountId") }, 
			   inverseJoinColumns = { @JoinColumn(name = "RoleId") })
	public Set<Role> getRoles() {
		return roles;
	}
	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
	
	/**
	 * 增加角色
	 * @param role
	 */
	public void add(Role obj){
		if (!roles.contains(obj)) {
			roles.add(obj);
		}
	}
	
	/**
	 * 删除角色
	 * @param role
	 */
	public void remove(Role obj){
		if (roles.contains(obj)) {
			roles.remove(obj);
		}
	}
	
	/**
	 * 	equals 判断实例是否相等
	 * 
	 * 	是本类实例并且实例id值相等返回true
	 * 	其它情况返回false
	 * 
	 * 	@param object 其它实例
	 */
	@Override
	public boolean equals(Object object) {
		if (!(object instanceof Account)) {
			return false;
		}
		Account other = (Account) object;
		if(!id.equals(other.id)){
			return false;
		}
		return true;
	}
}
